package com.hc.programming.number;

import com.google.common.collect.Lists;
import com.hc.programming.bean.ListNode;

/**
 * 给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
 * 请你将两个数相加，并以相同形式返回一个表示和的链表。
 * 你可以假设除了数字 0 之外，这两个数都不会以 0 开头
 *
 * @author huangchao E-mail:fengquan8866@163.com
 * @version 创建时间：2024/6/5 15:50
 */
public class 两数相加 {
    public static void main(String[] args) {
//        System.out.println(new 两数相加().addTwoNumbers(new ListNode(Lists.newArrayList(2, 4, 3)),
//                new ListNode(Lists.newArrayList(5, 6, 4))));
//        System.out.println(new 两数相加().addTwoNumbers(new ListNode(Lists.newArrayList(0)),
//                new ListNode(Lists.newArrayList(0))));
//        System.out.println(new 两数相加().addTwoNumbers(new ListNode(Lists.newArrayList(9,9,9,9,9,9,9)),
//                new ListNode(Lists.newArrayList(9,9,9,9))));
        System.out.println(new 两数相加().addTwoNumbers(new ListNode(Lists.newArrayList(2, 4, 9)),
                new ListNode(Lists.newArrayList(5, 6, 4, 9))));
    }

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode sumNode = new ListNode();
        ListNode result = sumNode;
        ListNode ln1 = l1, ln2 = l2;
        int pre = 0;
        // 1.循环l1
        while (ln1 != null) {
            int v1 = ln1.val;
            int v2 = ln2 == null ? 0 : ln2.val;
            int sum = pre + v1 + v2;
            pre = sum / 10;
            sumNode.val = sum % 10;
            if (ln2 != null) {
                ln2 = ln2.next;
            }
            if (ln1.next == null) {
                break;
            }
            ln1 = ln1.next;
            sumNode.next = new ListNode();
            sumNode = sumNode.next;
        }
        // 2.剩余循环l2
        while (ln2 != null) {
            sumNode.next = new ListNode();
            sumNode = sumNode.next;
            int v2 = ln2.val;
            int sum = pre + v2;
            pre = sum / 10;
            sumNode.val = sum % 10;
            ln2 = ln2.next;
        }
        // 3.溢出位补偿
        if (pre > 0) {
            sumNode.next = new ListNode(pre);
        }

        return result;
    }

}

